Sala situacional Salud intercultural e Investigación Social (2019-2024)
  • Inicio
  • Sala situacional: Salud Intercultural
    • Hepatitis B
    • Tuberculosis
    • Desnutricion
    • VIH
    • Anemia
    • Hipertensión
    • Dengue
    • Cambio Climático
    • Obesidad

On this page

  • Desnutrición en poblaciones andinas, amazónicas, afroperuanas y mestiza 2019-2021
  • Desnutrición en etnias del Perú 2019-2021
  • Desnutrición en poblaciones amazónicas 2019-2021
  • Desnutrición en poblaciones andinas 2019-2021
  • Desnutrición en población afroperuana por departamentos 2019-2021

Desnutrición en poblaciones de la Amazonía, Andes y Afroperuana

Análisis de datos del Ministerio de Salud (MINSA)

Author

Subdirección de Medicina Tradicional, Interculturalidad e Investigación Social (SUMEC-CENSI)

Published

January 15, 2026

La desnutrición se presenta cuando son insuficientes las calorías que se consumen o por la absorción deficiente de la cantidad de nutrientes esenciales (vitaminas y minerales) que permiten mantener la salud. Según la Organización Mundial de la salud, la desnutrición es una de las formas de malnutrición.

La desnutrición, especialmente en los niños, los hace más vulnerables a más enfermedades y el riesgo de quedar con daños permanentes y hasta morir.

Es necesario precisar que la diminución en el registro de los casos de esta problemática de salud se explica por la reducción en las atenciones en los servicios de salud a causa de la pandemia por la Covid-19.

Según el CIE 10, sistema internacional que clasifica las morbilidades para un mejor análisis, la desnutrición comprende las siguientes categorías:

  • Kwashiorkor

  • Marasmo nutricional

  • Desnutrición proteicocalórica severa, no especificada

  • Desnutrición proteicocalórica de grado moderado y leve

  • Retardo del desarrollo debido a desnutrición proteicocalórica

  • Desnutrición proteicocalórica, no especificada

Desnutrición en poblaciones andinas, amazónicas, afroperuanas y mestiza 2019-2021

  • Gráfico
  • Datos Fuente
Code
library(tidyverse)
library(plotly)
library(DT)
library(rio)

# --- FUNCIÓN AUXILIAR PARA TABLAS DE DESCARGA ---
# Esta función crea estandariza el botón de Excel para todos los gráficos
make_download_table <- function(data_input, filename_label = "datos") {
  datatable(
    data_input,
    extensions = 'Buttons',
    rownames = FALSE,
    options = list(
      dom = 'Bfrtip',
      buttons = list(
        list(extend = 'excel', filename = filename_label, title = filename_label),
        list(extend = 'csv', filename = filename_label)
      ),
      pageLength = 5, # Pocas filas para no ocupar mucho espacio
      scrollX = TRUE,
      language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json')
    )
  )
}

data_nutricion<- read_csv("data-nutricional.csv")

# 2. PROCESAMIENTO
plot_data <- data_nutricion %>%
  pivot_longer(
    cols = `2019`:`2021`, 
    names_to = "Año_Texto", 
    values_to = "Casos"
  ) %>%
  mutate(
    # Convertimos a número para que el eje X sea continuo y lineal
    Año = as.numeric(Año_Texto),
    
    # Creamos un texto bonito para cuando pases el mouse
    Tooltip_Text = paste0("<b>", `Grupo étnico`, "</b><br>",
                          "Año: ", Año, "<br>",
                          "Casos: ", format(Casos, big.mark = ","))
  )

# 3. GRÁFICO DE TENDENCIAS FACETADO (SEPARADO)
g_tendencias_sep <- ggplot(plot_data, aes(x = Año, y = Casos, color = `Grupo étnico`)) +
  
  # Líneas y Puntos
  geom_line(linewidth = 1.2) +
  geom_point(aes(text = Tooltip_Text), size = 3) +
  
  # --- AQUÍ ESTÁ LA CLAVE: Separar en paneles ---
  # ncol = 2 organiza los gráficos en 2 columnas
  facet_wrap(~`Grupo étnico`, ncol = 2, scales="free_y") + 
  
  # Paleta de colores
  scale_color_brewer(palette = "Set1") +
  
  # Ajustes de Ejes
  scale_x_continuous(breaks = c(2019, 2020, 2021)) +
  scale_y_continuous(labels = scales::comma, limits = c(0, NA)) + # El 0 asegura la comparabilidad
  
  labs(
    title = "Evolución de desnutrición por grupo poblacional",
    subtitle = "Tendencias separadas (2019-2021)",
    x = "",
    y = "Número de Casos (Escala variable)"
  ) +
  
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", size = 14),
    strip.text = element_text(face = "bold", size = 12), # Títulos de cada panel más grandes
    strip.background = element_rect(fill = "#f0f0f0", color = NA), # Fondo gris en títulos
    legend.position = "none", # Ocultamos la leyenda (ya está en el título de cada panel)
    panel.grid.minor = element_blank()
  )

# 4. INTERACTIVIDAD
ggplotly(g_tendencias_sep, tooltip = "text") %>%
  layout(
    margin = list(t = 60)
  )
Code
make_download_table(data_nutricion, "data_nutricion")

En las poblaciones amazónicas, se observa una disminución progresiva en los registros de casos de desnutrición, desde el 2019 al 2021, a diferencia de los otros grupos étnicos. El 2019, registró 21 483; el 2020, 10 126 y el 2021, 7 473. Del 2019 al 2020, disminuyó 53% y del 2020 al 2021, 26%. En las poblaciones andinas, 2019, registró 15 223; el 2020, 6 756 y el 2021, 7 066. Del 2019 al 2020, disminuyó 56% y del 2020 al 2021, aumentó en 5%. En la población afroperuana, aumentaron levemente los registros de casos, el 2019, registró 71 casos de desnutrición; el 2020, 74 y el 2021, 117. Del 2019 al 2020, aumentó 4% y del 2020 al 2021, 58%. uno de los factores puede ser por la disminución de registros por la restricción de los servicios durante la pandemia por la Covid-19.

Desnutrición en etnias del Perú 2019-2021

  • Tabla dinámica
  • Datos Fuente

En “categorías” se desagrega en Kwashiorkor; Marasmo nutricional; Desnutrición proteicocalórica severa, no especificada; Desnutrición proteicocalórica de grado moderado y leve; Retardo del desarrollo debido a desnutrición proteicocalórica; Desnutrición proteicocalórica, no especificada. En la catagoría total, se suma todos los casos.

Code
library(tidyverse)
library(plotly)
library(stringr)

data_nutricion_etnias<- read_csv("data_nutricion_etnias.csv")
data_nutricion_etnias<- data_nutricion_etnias%>%
  select(Etnias, Categorías, `2019`, `2020`, `2021`)
Code
#| echo: false
#| warning: false
#| message: false

library(tidyverse)
library(reactable)
library(htmltools)
library(sparkline)
library(scales)

# 2. PROCESAMIENTO
# Añadimos una columna con la lista de valores para generar el 'Sparkline' (minigráfico)
data_tabla <- data_nutricion_etnias %>%
  rowwise() %>%
  mutate(Tendencia = list(c(`2019`, `2020`, `2021`))) %>%
  ungroup()

# 3. CREACIÓN DE LA TABLA REACTABLE
reactable(
  data_tabla,
  pagination = TRUE,
  searchable = TRUE,
  showPageSizeOptions = TRUE,
  striped = TRUE,
  highlight = TRUE,
  defaultPageSize = 10,
  
  # Estilo general
  theme = reactableTheme(
    headerStyle = list(
      backgroundColor = "#aeeec9", # Color verde del encabezado original
      fontWeight = "bold",
      color = "#2e2e2e"
    ),
    borderColor = "#dfe2e5"
  ),
  
  columns = list(
    # Columna Etnias: Negrita y fondo suave
    Etnias = colDef(
      style = list(fontWeight = "bold", backgroundColor = "#f9fbf0"),
      minWidth = 120
    ),
    
    # Columna Categorías: Ancho suficiente para texto largo
    Categorías = colDef(
      minWidth = 250,
      style = list(fontSize = "0.9em", color = "#444")
    ),
    
    # Columna TENDENCIA (Sparkline)
    # Esta es la columna mágica que replica la línea azul del Datawrapper
    Tendencia = colDef(
      name = "2019-2021",
      cell = function(value, index) {
        sparkline(data_tabla$Tendencia[[index]], 
                  type = "line", 
                  width = 100, 
                  height = 25,
                  lineColor = "#18a1cd", # Azul Datawrapper
                  fillColor = "#d6eff7", # Relleno suave
                  spotColor = FALSE, 
                  minSpotColor = FALSE, 
                  maxSpotColor = FALSE)
      },
      minWidth = 120
    ),
    
    # Columnas de Años (Formateo simple)
    `2019` = colDef(maxWidth = 70, align = "center"),
    `2020` = colDef(maxWidth = 70, align = "center"),
    `2021` = colDef(
      maxWidth = 70, 
      align = "center",
      style = list(fontWeight = "bold", backgroundColor = "#f0f0f0") # Destacamos el último año
    )
  ),
  
  # Títulos y Fuentes
  elementId = "tabla-desnutricion"
) %>% 
  # Título externo a la tabla (HTML)
  htmlwidgets::prependContent(
    h3("Desnutrición en etnias del Perú 2019-2021", 
       style = "font-family: Arial; font-weight: bold; margin-bottom: 5px;"),
    p('En "categorías" se desagrega el tipo de desnutrición. En la categoría total, se suma todos los casos.',
      style = "font-family: Arial; color: #666; font-size: 0.9em; margin-bottom: 15px;")
  )

Desnutrición en etnias del Perú 2019-2021

En "categorías" se desagrega el tipo de desnutrición. En la categoría total, se suma todos los casos.

Durante el periodo analizado, 2019 al 2021, las etnias con más registros de casos son Quechua, Awajún, Ashaninka, Aimara, Shipibo-Konibo. Casi en todos aparece primero la categoría retardo del desarrollo debido a desnutrición proteicocalórica, sin embargo, el 2020, en los Aimaras aparece primero la categoría, Desnutrición proteicocalórica, no especificada. El 2021, Quechuas y Aimaras tienen más casos registrados en la categoría Desnutrición proteicocalórica, no especificada. En las etnias amazónicas aparecen más casos de la categoría Retardo del desarrollo debido a desnutrición proteicocalórica.

Code
make_download_table(data_nutricion_etnias, "data_desnutricion_etnias")

Desnutrición en poblaciones amazónicas 2019-2021

  • Piramide por grupo etario y año.
  • Datos fuentes

La categoría que prima más en los registros de casos es retardo del desarrollo debido a desnutrición proteicocalórica, el 2019 con 17 087 casos; el 2020, 8 303 y el 2021, 5 863 casos. En segundo lugar, es la categoría Desnutrición proteicocalórica de grado moderado y leve, el 2019 con 3 175 casos; el 2020, 1 421 y el 2021, 1 219 casos.

Code
#| echo: false
#| warning: false
#| message: false
#| fig-height: 10 
#| fig-width: 9

library(tidyverse)
library(plotly)
library(scales)

# 1. DATOS 
data_desnutricion_sexo <- tribble(
  ~Categoria, ~Año, ~M, ~F,
  "Kwashiorkor", 2019, 7, 17,
  "Kwashiorkor", 2020, 4, 1,
  "Kwashiorkor", 2021, 1, 2,
  "Marasmo nutricional", 2019, 14, 27,
  "Marasmo nutricional", 2020, 6, 8,
  "Marasmo nutricional", 2021, 1, 5,
  "Desnutrición proteicocalórica severa, no especificada", 2019, 221, 283,
  "Desnutrición proteicocalórica severa, no especificada", 2020, 121, 107,
  "Desnutrición proteicocalórica severa, no especificada", 2021, 79, 84,
  "Desnutrición proteicocalórica de grado moderado y leve", 2019, 1325, 1850,
  "Desnutrición proteicocalórica de grado moderado y leve", 2020, 636, 785,
  "Desnutrición proteicocalórica de grado moderado y leve", 2021, 590, 629,
  "Retardo del desarrollo debido a desnutrición proteicocalórica", 2019, 8192, 8895,
  "Retardo del desarrollo debido a desnutrición proteicocalórica", 2020, 4009, 4294,
  "Retardo del desarrollo debido a desnutrición proteicocalórica", 2021, 2774, 3089,
  "Desnutrición proteicocalórica, no especificada", 2019, 272, 380,
  "Desnutrición proteicocalórica, no especificada", 2020, 58, 97,
  "Desnutrición proteicocalórica, no especificada", 2021, 86, 133,
  "Total", 2019, 10031, 11452,
  "Total", 2020, 4834, 5292,
  "Total", 2021, 3531, 3942
)

# 2. PROCESAMIENTO
# Calculamos el valor máximo global para centrar el eje
max_valor <- max(c(data_desnutricion_sexo$M, data_desnutricion_sexo$F), na.rm = TRUE)
# Le damos un 10% de margen extra para que no quede pegado
limite_eje <- max_valor * 1.1

plot_data <- data_desnutricion_sexo %>%
  pivot_longer(cols = c("M", "F"), names_to = "Sexo", values_to = "Casos") %>%
  mutate(
    Casos_Plot = ifelse(Sexo == "M", -Casos, Casos),
    Año = factor(Año, levels = c(2021, 2020, 2019)),
    Categoria = factor(Categoria, levels = unique(data_desnutricion_sexo$Categoria)),
    
    Tooltip_Text = paste0(
      "<b>", Categoria, "</b><br>",
      "Año: ", Año, "<br>",
      "Sexo: ", ifelse(Sexo == "M", "Masculino", "Femenino"), "<br>",
      "Casos: ", format(Casos, big.mark = " ")
    )
  )

color_male <- "#61dcb6"   
color_female <- "#ffff8d" 

# 3. GRÁFICO BASE
g_piramide_centrada <- ggplot(plot_data, aes(x = Año, y = Casos_Plot, fill = Sexo)) +
  
  geom_col(aes(text = Tooltip_Text), width = 0.85) +
  
  coord_flip() +
  
  facet_wrap(~Categoria, ncol = 1, scales = "free_x") + # Mantenemos free_x
  
  scale_fill_manual(values = c("M" = color_male, "F" = color_female), 
                    labels = c("M" = "Hombres", "F" = "Mujeres")) +
  
  # --- LA MEJORA DE SIMETRÍA ---
  # Aunque usamos 'free_x' arriba para que cada faceta tenga su propia escala,
  # esto a veces descentra el 0 si la asimetría es grande.
  # Para forzar la simetría visual perfecta, usamos 'labels' para corregir los números
  # y expandimos el límite simétricamente.
  scale_y_continuous(
    labels = function(x) number(abs(x), big.mark = " "),
    # n.breaks = 5 fuerza a que haya marcas legibles (ej: 4000, 2000, 0, 2000, 4000)
    n.breaks = 5 
  ) +
  
  labs(
    title = "Desnutrición por sexo en poblaciones amazónicas",
    x = "",
    y = ""
  ) +
  
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", size = 14),
    strip.text = element_text(face = "bold", size = 10, hjust = 0),
    strip.background = element_rect(fill = "#f9f9f9", color = NA),
    panel.grid.major.y = element_blank(),
    legend.position = "bottom"
  )

# 4. CONVERSIÓN A INTERACTIVO CON AJUSTE FINO
p <- ggplotly(g_piramide_centrada, tooltip = "text", height = 1000) %>%
  layout(
    legend = list(orientation = "h", xanchor = "center", x = 0.5, y = -0.05),
    margin = list(t = 80, l = 50, b = 50)
  )

# --- TRUCO AVANZADO PARA CENTRAR EL CERO EN CADA FACETA ---
# Plotly con 'scales="free"' a veces mueve el cero.
# Este bucle recorre cada uno de los sub-gráficos (ejes X) y los fuerza a ser simétricos.
# Si el rango original era [-200, 500], lo fuerza a ser [-500, 500].

for(i in seq_along(p$x$layout)) {
  if(grepl("xaxis", names(p$x$layout)[i])) {
    # Obtenemos el rango actual que calculó ggplot automáticamente
    current_range <- p$x$layout[[i]]$range
    # Encontramos cuál es el valor absoluto más grande
    max_abs <- max(abs(current_range))
    # Forzamos el rango a ser simétrico: de -max a +max
    p$x$layout[[i]]$range <- c(-max_abs, max_abs)
  }
}

p
Code
make_download_table(data_desnutricion_sexo, "data_desnutricion_sexo")
  • Tendencia por grupo etario y año.
  • Datos fuentes

Afecta más a los niños de 1 a 5 años, el 2019 represento el 69% del total de casos, el 2020, el 73% y el 2021, el 59%. Es seguido por los niños de 1 a 11 meses.

Desnutrición por curso de vida en poblaciones amazónicas 2019-2021

2019 2020 2021
Code
make_download_table(data_curso_vida_full, "data_desnutricion_curso")
  • Tabla dinámica

En “categorías” se desagrega en Kwashiorkor; Marasmo nutricional; Desnutrición proteicocalórica severa, no especificada; Desnutrición proteicocalórica de grado moderado y leve; Retardo del desarrollo debido a desnutrición proteicocalórica; Desnutrición proteicocalórica, no especificada. En “total”, se suma todos los casos.

Code
library(tidyverse)
library(plotly)
library(stringr)

data_nutricion_amazonica<- read_csv("data_amazonicas_depart.csv")
data_nutricion_amazonica<- data_nutricion_amazonica%>%
  select(Departamentos, Categorías, `2019`, `2020`, `2021`)
Code
#| echo: false
#| warning: false
#| message: false

library(tidyverse)
library(reactable)
library(htmltools)
library(sparkline)

# 2. PROCESAMIENTO
# Añadimos una columna con la lista de valores para generar el 'Sparkline' (minigráfico)
data_tabla <- data_nutricion_amazonica %>%
  rowwise() %>%
  mutate(Tendencia = list(c(`2019`, `2020`, `2021`))) %>%
  ungroup()


# 3. CREACIÓN DE LA TABLA REACTABLE
reactable(
  data_tabla,
  pagination = TRUE,
  searchable = TRUE,
  showPageSizeOptions = TRUE,
  striped = TRUE,
  highlight = TRUE,
  defaultPageSize = 10,
  
  # Estilo general
  theme = reactableTheme(
    headerStyle = list(
      backgroundColor = "#ffe082", # Color verde del encabezado original
      fontWeight = "bold",
      color = "#333"
    ),
    borderColor = "#ddd"
  ),
  
  columns = list(
    # Columna Etnias: Negrita y fondo suave
    Departamentos = colDef(
      style = list(fontWeight = "bold", backgroundColor = "#f3e2a9"),
      minWidth = 130
    ),
    
    # Columna Categorías: Ancho suficiente para texto largo
    Categorías = colDef(
      minWidth = 250,
      style = list(fontSize = "0.9em", color = "#444")
    ),
    
    # Columna TENDENCIA (Sparkline)
    # Esta es la columna mágica que replica la línea azul del Datawrapper
    Tendencia = colDef(
      name = "2019-2021",
      cell = function(value, index) {
        sparkline(data_tabla$Tendencia[[index]], 
                  type = "bar",          # Tipo BARRA (como en tu imagen)
                  barColor = "#ffea00",  # Color de barra amarillo intenso
                  chartRangeMin = 0,
                  width = 80, 
                  height = 20)
      },
      style = list(backgroundColor = "#fffde7"), # Fondo crema para continuidad
      align = "center",
      minWidth = 150
    ),
    
    # Columnas de Años (Formateo simple)
    `2019` = colDef(maxWidth = 70, align = "center"),
    `2020` = colDef(maxWidth = 70, align = "center"),
    `2021` = colDef(
      maxWidth = 70, 
      align = "center",
      style = list(fontWeight = "bold", backgroundColor = "#f0f0f0") # Destacamos el último año
    )
  ),
  
  # Títulos y Fuentes
  elementId = "tabla-desnutricion"
) %>% 
  # Título externo a la tabla (HTML)
  htmlwidgets::prependContent(
    h3("Desnutrición en poblaciones amazónicas del Perú 2019-2021", 
       style = "font-family: Arial; font-weight: bold; margin-bottom: 5px;")
  )

Desnutrición en poblaciones amazónicas del Perú 2019-2021

El 2019 y 2020 aparecen en este orden las regiones con mayores registros: Amazonas, Loreto, Junín y Ucayali, sumando más del 90% de los casos totales en las poblaciones amazónicas. El 2021, continua primero Amazonas, seguido de Junín, Ucayali y Loreto, sumando el 87%.

Desnutrición en poblaciones andinas 2019-2021

  • Piramide por grupo etario y año.
  • Datos fuentes

Desde el 2019 al 2021, la categoría más registrada en la población andina fue retardo del desarrollo debido a desnutrición proteicocalórica con 9 733 casos: durante el 2020, 4 547 y en el 2021, 4 390 casos. En segundo lugar, la categoría desnutrición proteicocalórica, no especificada. En el 2019 con 3 968 casos; en el 2020, 1 467; y en el 2021, 1 685 casos.

La diferencia del número de casos entre hombres y mujeres, es mínima. Las mujeres, el 2019 registraron el 53%, el 2020, 50% y el 2021, 52% .

Code
make_download_table(data_desnutricion_andina, "data_desnutricion_andina")
  • Tendencia por grupo etario y año.
  • Datos fuentes

La desnutrición afecta principalmente a tres grupos de edades. Primero a los niños de 1 a 5 años, alcanzó al 31% del total de casos del 2019, el 43% del total de casos del 2020 y 36% del 2021. Es seguido por los adultos mayores con 30%, el 2019; 24%, el 2020 y 26%, el 2021. Continúan los adolescentes, 21%, el 2019; 13%, el 2020 y 17%, el 2021.

Desnutrición por etapa de vida en poblaciones andinas 2019-2021

2019 2020 2021
Code
make_download_table(data_etapa_andina, "data_desnutricion_etapa")
  • Tabla dinámica

En “categorías” se desagrega en Kwashiorkor; Marasmo nutricional; Desnutrición proteicocalórica severa, no especificada; Desnutrición proteicocalórica de grado moderado y leve; Retardo del desarrollo debido a desnutrición proteicocalórica; Desnutrición proteicocalórica, no especificada. En la categoría total, se suma todos los casos.

Code
library(tidyverse)
library(plotly)
library(stringr)

data_nutricion_andinas<- read_csv("data_nutricion_andinas.csv")
data_nutricion_andinas<- data_nutricion_andinas%>%
  select(Departamentos, Categorías, `2019`, `2020`, `2021`)
Code
#| echo: false
#| warning: false
#| message: false

library(tidyverse)
library(reactable)
library(htmltools)
library(sparkline)

# 2. PROCESAMIENTO
# Añadimos una columna con la lista de valores para generar el 'Sparkline' (minigráfico)
data_tabla <- data_nutricion_andinas %>%
  rowwise() %>%
  mutate(Tendencia = list(c(`2019`, `2020`, `2021`))) %>%
  ungroup()


# 3. CREACIÓN DE LA TABLA REACTABLE
reactable(
  data_tabla,
  pagination = TRUE,
  searchable = TRUE,
  showPageSizeOptions = TRUE,
  striped = TRUE,
  highlight = TRUE,
  defaultPageSize = 10,
  
  # Estilo general
  theme = reactableTheme(
    headerStyle = list(
      backgroundColor = "#6CD4B2", # Color verde del encabezado original
      fontWeight = "bold",
      color = "#333"
    ),
    borderColor = "#ddd"
  ),
  
  columns = list(
    # Columna Etnias: Negrita y fondo suave
    Departamentos = colDef(
      style = list(fontWeight = "bold", backgroundColor = "#A3F2D9"),
      minWidth = 130
    ),
    
    # Columna Categorías: Ancho suficiente para texto largo
    Categorías = colDef(
      minWidth = 250,
      style = list(backrunColor= "#CCF7E9", fontSize = "0.9em", color = "#333")
    ),
    
    # Columna TENDENCIA (Sparkline)
    # Esta es la columna mágica que replica la línea azul del Datawrapper
    Tendencia = colDef(
      name = "2019-2021",
      cell = function(value, index) {
        sparkline(data_tabla$Tendencia[[index]], 
                  type = "bar",          # Tipo BARRA (como en tu imagen)
                  barColor = "#FF9E75",  # Color de barra amarillo intenso
                  chartRangeMin = 0,
                  width = 80, 
                  height = 20)
      },
      style = list(backgroundColor = "#CCF7E9"), # Fondo crema para continuidad
      align = "center",
      minWidth = 150
    ),
    
    # Columnas de Años (Formateo simple)
    `2019` = colDef(maxWidth = 70, align = "center"),
    `2020` = colDef(maxWidth = 70, align = "center"),
    `2021` = colDef(
      maxWidth = 70, 
      align = "center",
      style = list(fontWeight = "bold", backgroundColor = "#f0f0f0") # Destacamos el último año
    )
  ),
  
  # Títulos y Fuentes
  elementId = "tabla-desnutricion"
) %>% 
  # Título externo a la tabla (HTML)
  htmlwidgets::prependContent(
    h3("Desnutrición en poblaciones amazónicas del Perú 2019-2021", 
       style = "font-family: Arial; font-weight: bold; margin-bottom: 5px;")
  )

Desnutrición en poblaciones amazónicas del Perú 2019-2021

En todo el periodo analizado son estas las regiones con mayores registros de casos de desnutrición: Ancash, Ayacucho, Puno y Huancavelica, con más del 90% del total de casos de las poblaciones andinas.

Desnutrición en población afroperuana por departamentos 2019-2021

  • Piramide por grupo etario y año.
  • Datos fuentes

La categoría más frecuente de desnutrición de la población afroperuana es Retardo del desarrollo debido a desnutrición proteicocalórica, el 2019 con 50 casos; el 2020, con 48 casos y el 2021 con 69 casos. Los casos registrados en hombres son ligeramente superiores al de las mujeres en el 2020 y 2021.

Code
make_download_table(data_sexo_afro, "data_desnutricion_sexo_afro")
  • Tendencia por grupo etario y año.
  • Datos fuentes

El 2019 aparecen más registros de casos en niños de 6 a 11 años con 37 casos. El 2020 y 2021, se observa más casos en niños de 1 a 5 años con 38 y 98 casos, respectivamente.

Code
#| echo: false
#| warning: false
#| message: false

library(tidyverse)
library(reactable)
library(htmltools)

# 1. DATOS TRANSCRITOS (Imagen: Curso de vida Afroperuana)
data_curso_afro <- tribble(
  ~Categoria, ~Edad, ~`2019`, ~`2020`, ~`2021`,
  
  # Severa
  "Desnutrición proteicocalórica severa, no especificada", "01-11m", 0, 1, 0,
  "Desnutrición proteicocalórica severa, no especificada", "01-05a", 1, 1, 2,
  "Desnutrición proteicocalórica severa, no especificada", "06-11a", 1, 0, 0,
  "Desnutrición proteicocalórica severa, no especificada", "60a >", 1, 0, 1,
  
  # Moderada y Leve
  "Desnutrición proteicocalórica de grado moderado y leve", "01-11m", 2, 12, 3,
  "Desnutrición proteicocalórica de grado moderado y leve", "01-05a", 5, 7, 36,
  "Desnutrición proteicocalórica de grado moderado y leve", "06-11a", 3, 0, 0,
  "Desnutrición proteicocalórica de grado moderado y leve", "12-17a", 0, 0, 3,
  "Desnutrición proteicocalórica de grado moderado y leve", "60a >", 2, 0, 1,
  
  # Retardo del desarrollo
  "Retardo del desarrollo debido a desnutrición proteicocalórica", "01-11m", 5, 16, 6,
  "Retardo del desarrollo debido a desnutrición proteicocalórica", "01-05a", 31, 29, 60,
  "Retardo del desarrollo debido a desnutrición proteicocalórica", "06-11a", 2, 0, 0,
  "Retardo del desarrollo debido a desnutrición proteicocalórica", "12-17a", 12, 3, 3,
  
  # No especificada
  "Desnutrición proteicocalórica, no especificada", "01-05a", 0, 1, 0,
  "Desnutrición proteicocalórica, no especificada", "06-11a", 0, 1, 0,
  "Desnutrición proteicocalórica, no especificada", "18-29a", 0, 1, 0,
  "Desnutrición proteicocalórica, no especificada", "30-59a", 1, 1, 0,
  "Desnutrición proteicocalórica, no especificada", "60a >", 5, 1, 2,
  
  # Total
  "Total Desnutrición", "01-11m", 0, 29, 9,
  "Total Desnutrición", "01-05a", 7, 38, 98,
  "Total Desnutrición", "06-11a", 37, 1, 0,
  "Total Desnutrición", "12-17a", 6, 3, 6,
  "Total Desnutrición", "18-29a", 12, 1, 0,
  "Total Desnutrición", "30-59a", 1, 1, 0,
  "Total Desnutrición", "60a >", 8, 1, 4
)

# 2. COLORES ESPECÍFICOS DE ESTA IMAGEN
c_2019_afro <- "#ffeb3b" # Amarillo brillante
c_2020_afro <- "#ffb74d" # Naranja
c_2021_afro <- "#61dcb6" # Verde Turquesa

# 3. FUNCIÓN DE BARRAS
bar_chart <- function(label, width_percent, color) {
  # Si el valor es 0, mostramos el número pero sin barra o barra mínima
  width_style <- if(label == 0) "0px" else width_percent
  
  bar <- div(
    style = list(
      background = color, 
      width = width_style, 
      height = "14px", 
      display = "inline-block",
      marginRight = "8px"
    )
  )
  div(
    style = list(display = "flex", alignItems = "center"),
    bar,
    span(style = list(fontSize = "13px", color = "#333"), label)
  )
}

# 4. TABLA REACTABLE
reactable(
  data_curso_afro,
  groupBy = "Categoria", 
  pagination = FALSE,    
  defaultExpanded = TRUE, 
  
  theme = reactableTheme(
    headerStyle = list(
      borderBottom = "2px solid #333",
      textTransform = "uppercase",
      fontSize = "12px",
      color = "#555",
      textAlign = "left"
    ),
    rowStyle = list(
      borderBottom = "1px solid #eee",
      fontSize = "13px"
    ),
    groupHeaderStyle = list(
      backgroundColor = "#f9f9f9",
      fontWeight = "bold",
      fontSize = "14px"
    )
  ),
  
  columns = list(
    Categoria = colDef(minWidth = 200),
    Edad = colDef(
      minWidth = 80,
      align = "right",
      style = list(fontWeight = "bold", color = "#555", borderRight = "1px solid #eee")
    ),
    
    `2019` = colDef(
      name = "2019",
      align = "left",
      cell = function(value) {
        max_val <- max(data_curso_afro$`2019`, na.rm = TRUE)
        width <- paste0((value / max_val) * 100, "%")
        bar_chart(value, width, c_2019_afro) 
      },
      minWidth = 150
    ),
    
    `2020` = colDef(
      name = "2020",
      align = "left",
      cell = function(value) {
        max_val <- max(data_curso_afro$`2020`, na.rm = TRUE)
        width <- paste0((value / max_val) * 100, "%")
        bar_chart(value, width, c_2020_afro) 
      },
      minWidth = 150
    ),
    
    `2021` = colDef(
      name = "2021",
      align = "left",
      cell = function(value) {
        max_val <- max(data_curso_afro$`2021`, na.rm = TRUE)
        width <- paste0((value / max_val) * 100, "%")
        bar_chart(value, width, c_2021_afro) 
      },
      minWidth = 150
    )
  )
) %>%
  htmlwidgets::prependContent(
    div(
      h3("Desnutrición por curso de vida en población afroperuana 2019-2021", 
         style = "font-family: Arial; font-weight: bold; margin-bottom: 5px;"),
      div(
        style = "margin-bottom: 15px; font-family: Arial; font-size: 12px;",
        span(style = paste0("background: ", c_2019_afro, "; width: 10px; height: 10px; display: inline-block; margin-right: 5px;")), "2019",
        span(style = paste0("margin-left: 10px; background: ", c_2020_afro, "; width: 10px; height: 10px; display: inline-block; margin-right: 5px;")), "2020",
        span(style = paste0("margin-left: 10px; background: ", c_2021_afro, "; width: 10px; height: 10px; display: inline-block; margin-right: 5px;")), "2021"
      )
    )
  )

Desnutrición por curso de vida en población afroperuana 2019-2021

2019 2020 2021
Code
make_download_table(data_curso_afro, "data_desnutricion_curso_afro")
  • Tabla dinámica
  • Datos Fuente
Code
library(tidyverse)
library(plotly)
library(stringr)

data_nutricion_afrodescendiente<- read_csv("data_nutricion_afro.csv")
data_nutricion_afrodescendiente<- data_nutricion_afrodescendiente%>%
  select(Departamento, Categorías, `2019`, `2020`, `2021`)
Code
#| echo: false
#| warning: false
#| message: false

library(tidyverse)
library(reactable)
library(htmltools)
library(sparkline)

# 2. PROCESAMIENTO
# Añadimos una columna con la lista de valores para generar el 'Sparkline' (minigráfico)
data_tabla <- data_nutricion_afrodescendiente %>%
  rowwise() %>%
  mutate(Tendencia = list(c(`2019`, `2020`, `2021`))) %>%
  ungroup()


# 3. CREACIÓN DE LA TABLA REACTABLE
reactable(
  data_tabla,
  pagination = TRUE,
  searchable = TRUE,
  showPageSizeOptions = TRUE,
  striped = TRUE,
  highlight = TRUE,
  defaultPageSize = 10,
  
  # Estilo general
  theme = reactableTheme(
    headerStyle = list(
      backgroundColor = "#66CDAA", # Color verde del encabezado original
      fontWeight = "bold",
      color = "#222"
    ),
    borderColor = "#fff"
  ),
  
  columns = list(
    # Columna Etnias: Negrita y fondo suave
    Departamento = colDef(
      style = list(fontWeight = "bold", backgroundColor = "#BEF7D6"),
      minWidth = 130
    ),
    
    # Columna Categorías: Ancho suficiente para texto largo
    Categorías = colDef(
      minWidth = 250,
      style = list(backrunColor= "#98F5D0", fontSize = "0.9em", color = "#333")
    ),
    
    # Columna TENDENCIA (Sparkline)
    # Esta es la columna mágica que replica la línea azul del Datawrapper
    Tendencia = colDef(
      name = "2019-2021",
      cell = function(value, index) {
        sparkline(data_tabla$Tendencia[[index]], 
                  type = "bar",          # Tipo BARRA (como en tu imagen)
                  barColor = "#00C200",  # Color de barra amarillo intenso
                  chartRangeMin = 0,
                  width = 80, 
                  height = 20)
      },
      style = list(backgroundColor = "#98F5D0"), # Fondo crema para continuidad
      align = "center",
      minWidth = 150
    ),
    
    # Columnas de Años (Formateo simple)
    `2019` = colDef(maxWidth = 70, align = "center"),
    `2020` = colDef(maxWidth = 70, align = "center"),
    `2021` = colDef(
      maxWidth = 70, 
      align = "center",
      style = list(fontWeight = "bold", backgroundColor = "#f0f0f0") # Destacamos el último año
    )
  ),
  
  # Títulos y Fuentes
  elementId = "tabla-desnutricion"
) %>% 
  # Título externo a la tabla (HTML)
  htmlwidgets::prependContent(
    h3("Desnutrición en poblacion afrodescendiente del Perú 2019-2021", 
       style = "font-family: Arial; font-weight: bold; margin-bottom: 5px;")
  )

Desnutrición en poblacion afrodescendiente del Perú 2019-2021

El 2019, las regiones con más registro de casos son Apurímac y Cajamarca, en tanto que el 2020 y el 2021 es Piura.

Code
make_download_table(data_tabla, "data_nutricion_afro_tabla")